home *** CD-ROM | disk | FTP | other *** search
/ Alles Voor Internet / Tout Pour Internet / alles voor internet.iso / MacInternet™ / Telnet / NCSA / tn3270 2.4d7 source / tn3270 / menu.c < prev    next >
Text File  |  1992-04-17  |  15KB  |  644 lines

  1. /*
  2.  *  tn3270 for the Macintosh Source Code
  3.  *  Brown University Computing and Information Services
  4.  *  Version 2.4d7  April, 1992
  5.  *  Copyright (c) 1988, 1989, 1990, 1991, 1992 by Brown University and by
  6.  *  Peter John DiCamillo.
  7.  *
  8.  *  Permission is granted to any individual or institution to use, copy,
  9.  *  or redistribute the binary version of this software and its
  10.  *  documentation provided this notice and the copyright notices are
  11.  *  retained.  Permission is granted to any individual or non-profit
  12.  *  institution to use, copy, modify, or redistribute the source files
  13.  *  of this software provided this notice and the copyright notices are
  14.  *  retained.  This software may not be distributed for profit, either
  15.  *  in original form or in derivative works, nor can the source be
  16.  *  distributed to other than an individual or a non-profit institution.
  17.  *  Any  individual or group interested in seeing and/or using these
  18.  *  source files but who are prevented from doing so by the above
  19.  *  constraints should contact Don Wolfe, Assistant Vice-President for
  20.  *  Computer Systems at Brown University, (401) 863-7250, for possible
  21.  *  software licensing of the source developed at Brown.
  22.  *
  23.  *  Brown University and Peter John DiCamillo make no representations
  24.  *  about the suitability of this software for any purpose.
  25.  *
  26.  *  BROWN UNIVERSITY AND PETER JOHN DICAMILLO GIVE NO WARRANTY, EITHER
  27.  *  EXPRESS OR IMPLIED, FOR THE PROGRAM AND/OR DOCUMENTATION PROVIDED,
  28.  *  INCLUDING, WITHOUT LIMITATION, WARRANTY OF MERCHANTABILITY AND
  29.  *  WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE.
  30.  *
  31.  */
  32.  
  33. #if !defined(USEDUMP)
  34.     #include "maclib.h"
  35.     #include "termdef.h"
  36.     #include "tn3270funcs.h"
  37.     #include "globals.h"
  38. #else
  39.     #pragma load "tn3270DumpFile"
  40. #endif
  41.  
  42. #include "netevent.h"
  43. #include "hostform.h"
  44. #include "NCSAfuncs.h"        /* must follow hostform.h */
  45.  
  46. #pragma segment 3270seg2
  47.  
  48. #define langMenu    234
  49. #define kmapMenu    235
  50. #define cfigMenu    236
  51. #define appleMenu    256
  52. #define    fileMenu    257
  53. #define editMenu    258
  54. #define setMenu        259
  55. #define fkeyMenu    260
  56. #define netMenu        261
  57. #define connMenu    262
  58.  
  59. extern char da_menu;
  60. extern int MacBinary;
  61. extern char showstg;
  62. extern char mdm_open;                    /* modem port is open */
  63. extern char serserverconn;                /* connected to serial server */
  64.  
  65. char ftpavail;
  66.  
  67. void menu_upd(void)
  68. {
  69. short i, msize;
  70. char fullscreen, checkflag, enableflag;
  71. unsigned char itemname[256];
  72. cnr *cp, *conncp;
  73.  
  74. cp = front_cp();
  75.  
  76. /* language menu */
  77.  
  78. msize = CountMItems(nlMenu);
  79. for (i=1; i <= msize; i++) {
  80.     GetItem(nlMenu, i, itemname);
  81.     p2cstr(itemname);
  82.     checkflag = false;
  83.     if (cp != 0) checkflag = strcmp(itemname, cp->csnlname) == 0;
  84.     CheckItem(nlMenu, i, checkflag);
  85.     }
  86.  
  87. /* keyboard menu */
  88.  
  89. msize = CountMItems(kybdMenu);
  90. for (i=1; i <= msize; i++) {
  91.     GetItem(kybdMenu, i, itemname);
  92.     p2cstr(itemname);
  93.     checkflag = false;
  94.     if (cp != 0) checkflag = strcmp(itemname, cp->cskybdname) == 0;
  95.     CheckItem(kybdMenu, i, checkflag);
  96.     }
  97.  
  98. /* file menu */
  99.  
  100. if (cp != 0) {
  101.     if (zoomstate(cp) == inZoomOut) {
  102.         SetItem(myMenus[1], 5, "\pZoom Out");
  103.         }
  104.     else {
  105.         SetItem(myMenus[1], 5, "\pZoom In");
  106.         }
  107.     CheckItem(myMenus[1], 10, cp->savepict != 0);
  108.     CheckItem(myMenus[1], 16, cp->kabort != 0);
  109.     }
  110. else {
  111.     SetItem(myMenus[1], 5, "\pZoom In");
  112.     CheckItem(myMenus[1], 10, 0);
  113.     CheckItem(myMenus[1], 16, 0);
  114.     }
  115.  
  116. if (da_menu) {
  117.     DisableItem(myMenus[1], 1);
  118.     DisableItem(myMenus[2], 2);
  119.     DisableItem(myMenus[1], 3);
  120.     DisableItem(myMenus[1], 5);
  121.     DisableItem(myMenus[1], 7);
  122.     DisableItem(myMenus[1], 8);
  123.     DisableItem(myMenus[1], 10);
  124.     DisableItem(myMenus[1], 12);
  125.     DisableItem(myMenus[1], 13);
  126.     if (havesa) DisableItem(myMenus[1], 14);
  127.     DisableItem(myMenus[1], 15);
  128.     DisableItem(myMenus[1], 16);
  129.     DisableItem(myMenus[1], 17);
  130.     if (havesa) DisableItem(myMenus[1], 18);
  131.     CheckItem(myMenus[1], 19, 0);
  132.     }
  133. else {
  134.     enableflag = 0;
  135.     for (i=0; i < MAXSESSIONS; i++) {
  136.         if (cplist[i] == 0) {
  137.             enableflag = 1;
  138.             break;
  139.             }
  140.         }
  141.     enable_menu_item(myMenus[1], 1, enableflag);
  142.     EnableItem(myMenus[1], 2);
  143.     EnableItem(myMenus[1], 12);
  144.     if (havesa) {
  145.         enable_menu_item(myMenus[1], 14,
  146.             (serserverconn == 0) && mdm_open);
  147.         enable_menu_item(myMenus[1], 18, serserverconn);
  148.         }
  149.  
  150.     if (cp == 0) {
  151.         DisableItem(myMenus[1], 3);
  152.         DisableItem(myMenus[1], 5);
  153.         enable_menu_item(myMenus[1], 7, enableflag);
  154.         DisableItem(myMenus[1], 8);
  155.         DisableItem(myMenus[1], 10);
  156.         DisableItem(myMenus[1], 13);
  157.         DisableItem(myMenus[1], 15);
  158.         DisableItem(myMenus[1], 16);
  159.         DisableItem(myMenus[1], 17);
  160.         CheckItem(myMenus[1], 19, 0);
  161.         }
  162.  
  163.     else {
  164.         EnableItem(myMenus[1], 3);
  165.         enable_menu_item(myMenus[1], 5, cp->zoomok && (cp->myWindow != 0));
  166.         if (cp->cs.autoconn == 0) {
  167.             enableflag = true;
  168.             }
  169.         enable_menu_item(myMenus[1], 7, enableflag);
  170.         EnableItem(myMenus[1], 8);
  171.         enable_menu_item(myMenus[1], 10, cp->PictPtr != 0);
  172.         enable_menu_item(myMenus[1], 13, cp->myWindow != 0);
  173.         EnableItem(myMenus[1], 15);
  174.         enable_menu_item(myMenus[1], 16, cp->vmxbgn);
  175.         enable_menu_item(myMenus[1], 17,
  176.             cp->xdlg && (cp->xdlgptr != FrontWindow()));
  177.         CheckItem(myMenus[1], 19, done);
  178.         }
  179.     }
  180.     
  181. /* Edit menu */
  182.  
  183. if (da_menu) {
  184.     EnableItem(myMenus[2], 1);
  185.     EnableItem(myMenus[2], 3);
  186.     EnableItem(myMenus[2], 4);
  187.     EnableItem(myMenus[2], 5);
  188.     EnableItem(myMenus[2], 6);
  189.     DisableItem(myMenus[2], 7);
  190.     DisableItem(myMenus[2], 8);
  191.     }
  192. else {
  193.     DisableItem(myMenus[2], 1);
  194.  
  195.     if (cp == 0) {
  196.         DisableItem(myMenus[2], 3);                            /* Cut */
  197.         DisableItem(myMenus[2], 4);                            /* Copy */
  198.         DisableItem(myMenus[2], 5);                            /* Paste */
  199.         DisableItem(myMenus[2], 6);                            /* Clear */
  200.         DisableItem(myMenus[2], 7);                            /* Copy Table */
  201.         DisableItem(myMenus[2], 8);                            /* Copy Text */
  202.         }
  203.  
  204.     else {
  205.         if (cp->textsel) checksel(cp);
  206.         fullscreen = cp->connstate > 4;
  207.         enable_menu_item(myMenus[2], 3, cp->textsel && fullscreen);    /* Cut */
  208.         enable_menu_item(myMenus[2], 4, cp->textsel);                /* Copy */
  209.         enable_menu_item(myMenus[2], 5, pasteok);                    /* Paste */
  210.         enable_menu_item(myMenus[2], 6, cp->textsel && fullscreen);    /* Clear */
  211.         enable_menu_item(myMenus[2], 7, cp->textsel);                /* Copy Table */
  212.         enable_menu_item(myMenus[2], 8, cp->textsel);                /* Copy Text */
  213.         }
  214. }
  215.     
  216. /* Session menu */
  217. enable_menu_item(myMenus[3], 4, colormac && (!cp->cs.nocolor));
  218. enable_menu_item(myMenus[3], 6, (rowmax9 > 24) || (colmax9 > 80));
  219. msize = CountMItems(kybdMenu);
  220. enable_menu_item(myMenus[3], 8, msize > 1);
  221. msize = CountMItems(nlMenu);
  222. enable_menu_item(myMenus[3], 9, msize > 1);
  223.  
  224. /* Network menu */
  225. if (havetcp) {
  226.     enable_menu_item(myMenus[5], 2, cp != 0);
  227.     CheckItem(myMenus[5], 3, ftpavail != 0);
  228.     CheckItem(myMenus[5], 4, MacBinary != 0);
  229.     enableflag = false;
  230.     if (cp != 0) {
  231.         enableflag = tcp_session(cp);
  232.         }
  233.     for (i = 6; i < 12; i++) {
  234.         enable_menu_item(myMenus[5], i, enableflag);
  235.         }
  236.     }
  237.  
  238. /* Connections menu */
  239.  
  240. for (i=1; i <= MAXSESSIONS; i++) {
  241.     conncp = menu_cplist[i];
  242.     if (conncp == 0) break;
  243.     CheckItem(myMenus[6], i, cp == conncp);
  244.     }
  245.  
  246. }
  247.  
  248. void docommand(long mResult, char append)
  249. {
  250. register short theItem, theMenu, i;
  251. register unsigned char name[40];
  252. WindowRecord * fw;
  253. static unsigned char brkstr[] = {255, 243};
  254. static unsigned char ipstr[] = {255, 244};
  255. static unsigned char aostr[] = {255, 245};
  256. static unsigned char aytstr[] = {255, 246};
  257. static unsigned char ecstr[] = {255, 247};
  258. static unsigned char elstr[] = {255, 248};
  259. unsigned char itemname[256];
  260. unsigned char **temph;
  261. cnr *cp, *cptemp;
  262. char cancelflag;
  263.  
  264. theMenu = mResult >> 16;
  265. theItem = mResult & 0xff;
  266.  
  267. cp = front_cp();
  268.  
  269. switch(theMenu) {
  270.     case langMenu:
  271.         GetItem(nlMenu, theItem, itemname);
  272.         p2cstr(itemname);
  273.         if (theItem > 1) {
  274.             c2pstr(itemname);
  275.             temph = GetNamedResource('GFNL', itemname);
  276.             p2cstr(itemname);
  277.             if (temph != 0L) {
  278.                 strcpy(cp->csnlname, itemname);
  279.                 if (GetHandleSize(temph) == 1) {
  280.                     cp->nl_handle = 0;
  281.                     newstdfont(**temph, cp);
  282.                     cp->plainala = 0;
  283.                     }
  284.                 else if (GetHandleSize(temph) == 3) {
  285.                     cp->nl_handle = 0;
  286.                     newstdfont(**temph, cp);
  287.                     cp->plainala = ((*temph)[1] & 0x80) == 0x80;
  288.                     }
  289.                 else {
  290.                     cp->nl_handle = temph;
  291.                     defxtab(cp->nl_handle, cp->nltab);
  292.                     newstdfont(NORMALFONT, cp);
  293.                     cp->plainala = 0;
  294.                     }
  295.                 }
  296.             }
  297.         else {
  298.             strcpy(cp->csnlname, itemname);
  299.             cp->nl_handle = 0;
  300.             newstdfont(NORMALFONT, cp);
  301.             cp->plainala = 0;
  302.             }
  303.         if (cp->myWindow != 0) invldscr(cp);
  304.         break;
  305.     case kmapMenu:
  306.         GetItem(kybdMenu, theItem, itemname);
  307.         temph = GetNamedResource('GFKB', itemname);
  308.         p2cstr(itemname);
  309.         if (temph != 0L) {
  310.             cp->kb_handle = temph;
  311.             strcpy(cp->cskybdname, itemname);
  312.             }
  313.         break;
  314.     case cfigMenu:
  315.         switch(theItem) {
  316.             case 1:
  317.                         hostcfdlg();
  318.                         break;
  319.             case 2:
  320.                         cf_fmtdlg();
  321.                         break;
  322.             case 3:
  323.                         cf_featdlg();
  324.                         break;
  325.             case 4:
  326.                         specdlg();
  327.                         break;
  328.             default:
  329.                         break;
  330.             }
  331.         break;
  332.     case appleMenu:
  333.         if (theItem == 2) break;
  334.         if (theItem == 1) {
  335.             aboutdlg();
  336.             if ((cp == 0) && showstg) {
  337.                 stginfo(cp);
  338.                 showstg = 0;
  339.                 }
  340.             break;
  341.             }
  342.         GetItem(myMenus[0], theItem, name);
  343.         exportscrap(0);
  344.         OpenDeskAcc(name);
  345.         importscrap();
  346.         break;
  347.     case fileMenu:
  348.         switch (theItem) {
  349.             case 1: newlogin(0, 0, 0, 0, 0);
  350.                     break;
  351.             case 3: if (!(cp->serflg && (cp->connstate <= 1))) {
  352.                         closeresponse(closeUser, cp);
  353.                         }    
  354.                     if (cp->serflg) serlgout(0, cp);
  355.                     else if (cp->tcpflg) tcplgout(0, cp);
  356.                     else salgout(0, cp);
  357.                     break;
  358.             case 5: dozoom(cp->myWindow, zoomstate(cp));
  359.                     break;
  360.             case 7: read_settings(0, cp);
  361.                     break;
  362.             case 8: write_settings(cp);
  363.                     break;
  364.             case 10:
  365.                     cp->savepict ^= 1;
  366.                     break;
  367.             case 12:
  368.                     pgsetup();
  369.                     break;
  370.             case 13:
  371.                     prscreen(cp);
  372.                     break;
  373.             case 14:
  374.                     if (havesa) sersendinit(1);
  375.                     break;
  376.             case 15:
  377.                     crsetdlg(cp);
  378.                     break;
  379.             case 16:    
  380.                     cp->kabort ^= 1;
  381.                     break;
  382.             case 17:    
  383.                     if (cp->xdlg) SelectWindow(cp->xdlgptr);
  384.                     break;
  385.             case 18:
  386.                     if (havesa) sersrvlgout(1);
  387.                     break;
  388.             case 19:
  389.                     if (!da_menu) {
  390.                         cancelflag = 0;
  391.                         for (i=0; i < MAXSESSIONS; i++) {
  392.                             cptemp = cplist[i];
  393.                             if (cptemp != 0) {
  394.                                 cancelflag = (wants_to_quit(cptemp) == 0);
  395.                                 if (cancelflag) break;
  396.                                 }
  397.                             }
  398.                         if (!cancelflag) {
  399.                             done ^= 1;
  400.                             }
  401.                         break;
  402.                         }
  403.                     else {
  404.                         fw = (WindowRecord *)FrontWindow();
  405.                         i = fw->windowKind;
  406.                         if (i<0)CloseDeskAcc(i);
  407.                         }
  408.             default: break;
  409.             }
  410.         break;
  411.     case editMenu:
  412.         if (da_menu) {
  413.             SystemEdit(theItem-1);
  414.             }
  415.         else {
  416.             switch(theItem) {
  417.                 case 3:    scrapcut(append, cp);
  418.                         break;
  419.                 case 4:    scrapcopy(append, cp);
  420.                         break;
  421.                 case 5:    scrappaste(cp);
  422.                         break;
  423.                 case 6:    scrapclear(cp);
  424.                         break;
  425.                 case 7:    scrapcopytable(append, cp);
  426.                         break;
  427.                 case 8:    scrapcopytext(append, cp);
  428.                         break;
  429.                 default:
  430.                         break;
  431.                 }
  432.             }
  433.         break;
  434.     case setMenu:
  435.         switch (theItem) {
  436.             case 1: featdlg(cp);
  437.                     break;
  438.             case 2: clickdlg(cp);
  439.                     break;
  440.             case 3: attrdlg(cp);
  441.                     break;
  442.             case 4: colordlg(cp);
  443.                     if (cp->myWindow != 0) {
  444.                         invldscr(cp);
  445.                         cp->cs.stat_time += 8;    /* force time to be re-drawn */
  446.                         newstat(cp);
  447.                         newinvbw(cp);
  448.                         }
  449.                     break;
  450.             case 5: psdlg(cp);
  451.                     break;
  452.             case 6:    fmtdlg(cp);
  453.                     break;
  454.             case 7:    miscdlg(cp);
  455.                     break;
  456.             default: break;
  457.             }
  458.         break;
  459.     case fkeyMenu:
  460.         clickattn(theItem, cp);
  461.         break;
  462.     case netMenu:
  463.         switch (theItem) {
  464.             case 1:    promptip(1);    /* r/o network configuration */
  465.                     break;
  466.             case 2:    tcpinfo(cp);        /* network status info. */
  467.                     break;
  468.             case 3:    ftpavail = !ftpavail;    /* FTP Enable */
  469.                     Sftpmode(ftpavail);
  470.                     break;
  471.             case 4:    MacBinary = !MacBinary;    /* MacBinary mode */
  472.                     break;
  473.             case 5:    show_writeinfo(cp);            /* debugging info */
  474.                     break;
  475.             case 6:    tcpwrite(brkstr, 2, cp);    /* Break */
  476.                     break;
  477.             case 7:    tcpwrite(ipstr, 2, cp);        /* Interrupt Process */
  478.                     break;
  479.             case 8:    tcpwrite(aostr, 2, cp);        /* Abort Output */
  480.                     break;
  481.             case 9:    tcpwrite(aytstr, 2, cp);    /* Are You There? */
  482.                     break;
  483.             case 10: tcpwrite(ecstr, 2, cp);    /* Erase Character */
  484.                     break;
  485.             case 11: tcpwrite(elstr, 2, cp);    /* Erase Line */
  486.                     break;
  487.             default: break;
  488.             }
  489.         break;
  490.  
  491.     case connMenu:
  492.         cptemp = menu_cplist[theItem];
  493.         if (cptemp != 0) {
  494.             if (cptemp->myWindow == 0) {
  495.                 conndlg(cptemp);
  496.                 }
  497.             else {
  498.                 SelectWindow(cptemp->myWindow);
  499.                 }
  500.             }
  501.         break;
  502.  
  503.     default:
  504.         break;
  505.     }
  506.     HiliteMenu(0);
  507.     appl_menu();
  508. }
  509.  
  510. void clickattn(short itm, cnr *cp)
  511. {
  512. static unsigned char spctab[8] =
  513.     {171, 170, 167, 168, 181, 183, 184, 189};
  514. unsigned char code;
  515.  
  516. if ((itm < 1) | (itm > 32)) return;
  517. if (itm > 24) {
  518.     code = spctab[itm-25];
  519.     }
  520. else code = itm + 142;
  521.  
  522. if (cp->serflg) serin(code, 0, cp);
  523. else if (cp->tcpflg) tcpin(0, code, 0, cp);
  524. else sain(0, code, 0, cp);
  525. }
  526.  
  527. void appl_menu(void)    /* enable correct application menus */
  528. {
  529. static char last_da = 2;    /* init to invalid value */
  530. static char last_frontcp = 2;
  531. static char last_fkey = 2;
  532. static char last_conns = 2;
  533. static char last_tcp = 2;
  534. char new_da, new_frontcp, new_fkey, new_conns, new_tcp;
  535. cnr *cp;
  536. short i;
  537.  
  538. /* skip drawing menu if no changes from last time */
  539. new_da = da_menu;
  540. cp = front_cp();
  541. if (cp == 0) {
  542.     new_frontcp = new_fkey = 0;
  543.     }
  544. else {
  545.     new_frontcp = 1;
  546.     new_fkey = cp->showfkey;
  547.     }
  548. new_conns = 0;
  549. for (i=0; i < MAXSESSIONS; i ++) {
  550.     if (cplist[i] != 0) {
  551.         new_conns = 1;
  552.         break;
  553.         }
  554.     }
  555. new_tcp = havetcp;
  556.  
  557. if ((last_da == new_da) && 
  558.     (last_frontcp == new_frontcp) &&
  559.     (last_fkey == new_fkey) &&
  560.     (last_conns == new_conns) &&
  561.     (last_tcp == new_tcp)) return;
  562. last_da = new_da;        /* save values for next time */
  563. last_frontcp = new_frontcp;
  564. last_fkey = new_fkey;
  565. last_conns = new_conns;
  566. last_tcp = new_tcp;
  567.  
  568. if (new_da) {
  569.     DisableItem(myMenus[3], 0);
  570.     DisableItem(myMenus[4], 0);
  571.     DisableItem(myMenus[5], 0);
  572.     DisableItem(myMenus[6], 0);
  573.     }
  574. else {
  575.     enable_menu_item(myMenus[3], 0, new_frontcp);
  576.     enable_menu_item(myMenus[4], 0, new_fkey);
  577.     enable_menu_item(myMenus[5], 0, new_tcp);
  578.     enable_menu_item(myMenus[6], 0, new_conns);
  579.     }
  580. DrawMenuBar();
  581. }
  582.  
  583. void enable_menu_item(MenuHandle theMenu,
  584.                       short item,
  585.                       char enableflag)
  586. {
  587. if (enableflag) {
  588.     EnableItem(theMenu, item);
  589.     }
  590. else {
  591.     DisableItem(theMenu, item);
  592.     }
  593. }
  594.  
  595. void new_connmenu(void)
  596. {
  597. cnr *cp;
  598. short i, j, m_index, menusize;
  599. unsigned char newname[256];
  600.  
  601. m_index = 1;
  602. for (i=0; i < MAXSESSIONS; i++) {
  603.     cp = cplist[i];
  604.     if (cp != 0) menu_cplist[m_index++] = cp;
  605.     }
  606. menusize = m_index-1;
  607. while (m_index < MAXSESSIONS+1) {
  608.     menu_cplist[m_index++] = 0;
  609.     }
  610. DeleteMenu(connMenu);
  611. ReleaseResource((Handle)myMenus[6]);
  612. myMenus[6] = GetMenu(connMenu);
  613. InsertMenu(myMenus[6], connMenu);
  614. if (menusize == 0) return;
  615. if (menusize > 1) {            /* sort items in array */
  616.     menu_cplist[0] = 0;
  617.     for (i=2; i <= menusize; i++) {
  618.         cp = menu_cplist[i];
  619.         j = i;
  620.         while (sessnamecomp(menu_cplist[j-1], cp)) {
  621.             menu_cplist[j] = menu_cplist[j-1];
  622.             j = j-1;
  623.             }
  624.         menu_cplist[j] = cp;
  625.         }
  626.     }
  627. for (i = 1; i <= menusize; i++) {
  628.     cp = menu_cplist[i];
  629.     get_sessname(newname, cp);
  630.     c2pstr(newname);
  631.     AppendMenu(myMenus[6], newname);
  632.     }
  633. }
  634.  
  635. Boolean sessnamecomp(cnr *a, cnr *b)
  636. {
  637. char result;
  638.  
  639. if (a == 0) return(false);
  640. result = strcmp(a->sessname, b->sessname);
  641. if (result < 0) return(false);
  642. if (result > 0) return(true);
  643. return((a->sessnameseq) > (b->sessnameseq));
  644. }